package com.freecloud.javabasics.thread.lock;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author: maomao
 * @Date: 2020-02-18 09:22
 */
public class ReentrantLockDemo {

    //synchronized的原子操作改造成Lock

    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        //获得一个锁
        lock.lock();

        lock.tryLock();

        try{
            //可中断的锁
            lock.lockInterruptibly();

            //带时间限制的加锁
            lock.tryLock(10L, TimeUnit.SECONDS);
        }catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //释放锁 ,确保锁释放
            lock.unlock();
        }
    }

    /**
     * 当多个线程竞争锁时，其他线程怎么办？  ->阻塞
     *
     *
     * AbstractQueuedSynchronizer（同步工具AQS）
     *
     * 1. 独占 ->互斥
     * 2. 共享 ->读写锁
     */
}
